﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EnviamentDeDocuments.ObjectesDeDades;

namespace EnviamentDeDocuments.ObjectesDeNegoci
{
    public class WorkflowController
    {

        private enum enumEstatWorkflow
        {             
            ComprovarConfiguracio,
            ConfigurarEnviament,
            ComprovarDadesClients,
            ProcessarEnviament,
            Final
        }

        private List<Client> ClientsSeleccionats { get; set; }
        private List<Impost> ImpostosSeleccionats { get; set; }
        private List<Periode> PeriodesSeleccionats { get; set; }
        private Exercici ExerciciSeleccionat { get; set; }

        private enumEstatWorkflow EstatActual = enumEstatWorkflow.ComprovarConfiguracio;

        public void Start()
        {
            //try
            //{
            //    Application.EnableVisualStyles();
            //    Application.SetCompatibleTextRenderingDefault(false);
            //}
            //catch (Exception e)
            //{
            //    System.Diagnostics.Debug.Print(e.Message);
            //}


            while (EstatActual != enumEstatWorkflow.Final)
            {
                runNextStep();
            }
        }

        private void runNextStep()
        {
            switch (EstatActual)
            {
                case enumEstatWorkflow.ComprovarConfiguracio:
                    ComprovarConfiguracioController comprovarConfiguracioController = new ComprovarConfiguracioController();
                    comprovarConfiguracioController .run();

                    if (comprovarConfiguracioController .ProximaAccio == Controller.enumProximaAccio.ProximPas)
                        EstatActual++;
                    else
                        TancarAplicacio();
                    break;

                case enumEstatWorkflow.ConfigurarEnviament:
                    ConfigurarEnviamentController configurarEnviamentController = new ConfigurarEnviamentController();

                    configurarEnviamentController.ClientsSeleccionats = ClientsSeleccionats;
                    configurarEnviamentController.ImpostosSeleccionats = ImpostosSeleccionats;
                    configurarEnviamentController.PeriodesSeleccionats = PeriodesSeleccionats;
                    configurarEnviamentController.ExerciciSeleccionat = ExerciciSeleccionat;

                    configurarEnviamentController.run();

                    if (configurarEnviamentController.ProximaAccio == Controller.enumProximaAccio.ProximPas)
                    {
                        EstatActual++;

                        ClientsSeleccionats = configurarEnviamentController.ClientsSeleccionats;
                        ImpostosSeleccionats = configurarEnviamentController.ImpostosSeleccionats;
                        PeriodesSeleccionats = configurarEnviamentController.PeriodesSeleccionats;
                        ExerciciSeleccionat = configurarEnviamentController.ExerciciSeleccionat;
                    }
                    else
                        TancarAplicacio();
                    break;

                case enumEstatWorkflow.ComprovarDadesClients:
                    ComprovarDadesController comprovarDadesController = new ComprovarDadesController();

                    comprovarDadesController.ClientsSeleccionats = ClientsSeleccionats;
                    comprovarDadesController.ImpostosSeleccionats = ImpostosSeleccionats;
                    comprovarDadesController.PeriodesSeleccionats = PeriodesSeleccionats;
                    comprovarDadesController.ExerciciSeleccionat = ExerciciSeleccionat;

                    comprovarDadesController.run();

                    if (comprovarDadesController.ProximaAccio == Controller.enumProximaAccio.ProximPas)
                    {
                        EstatActual++;
                    }
                    else if (comprovarDadesController.ProximaAccio == Controller.enumProximaAccio.AnteriorPas)
                    {
                        EstatActual--;
                    }
                    else
                        TancarAplicacio();
                    break;
                
                case enumEstatWorkflow.ProcessarEnviament:
                    ProcessarEnviamentController processarEnviamentController = new ProcessarEnviamentController();

                    processarEnviamentController.ClientsSeleccionats = ClientsSeleccionats;
                    processarEnviamentController.ImpostosSeleccionats = ImpostosSeleccionats;
                    processarEnviamentController.PeriodesSeleccionats = PeriodesSeleccionats;
                    processarEnviamentController.ExerciciSeleccionat = ExerciciSeleccionat;

                    processarEnviamentController.run();

                    if (processarEnviamentController.ProximaAccio == Controller.enumProximaAccio.ProximPas)
                    {
                        EstatActual++;
                    }
                    else if (processarEnviamentController.ProximaAccio == Controller.enumProximaAccio.AnteriorPas)
                    {
                        EstatActual -= 2;
                    }
                    else
                        TancarAplicacio();
                    break;

                case enumEstatWorkflow.Final:
                    TancarAplicacio();
                    break;

            }

        }

        private void TancarAplicacio()
        {
            EstatActual = enumEstatWorkflow.Final;
        }

    }
}
